﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CKM_Komiwojazer
{
    public partial class Glowna : Form
    {
        Koszty k = null;
        public Glowna()
        {
            InitializeComponent();
            btnStart.Enabled = false;
            txtKoszty.Enabled = false;
            progressBar1.Visible = false;
            cmbOK.Items.Add("PMX");
            cmbOK.Items.Add("CKM");
            cmbOK.SelectedItem = "PMX";           
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            int ok;
            double pMut;
            int roz, pok, kosztPocz;

            progressBar1.Visible = true;

            if ((SprawdzParametry(out pMut, out roz, out ok, out pok)) == 0)
            {

                Populacja p = new Populacja(k, pMut, roz, ok);

                p.generujLosowaPopulacje();
                kosztPocz = p.pobierzKosztNajlepszego(true);
                p.symulujNPokolen(pok, progressBar1);
                p.aktualizujNajlepszego();

                Wyniki wyniki = new Wyniki(p, kosztPocz);
                wyniki.StartPosition = FormStartPosition.CenterParent;
                wyniki.ShowDialog(this);

                progressBar1.Value = 0;
                progressBar1.Visible = false;
            }              
        }

        private int SprawdzParametry(out double pm, out int r, out int ok, out int pok)
        {
            
            ok = 0;
            pm = r = pok = 0;

            
         
            try
            {
                if (Double.Parse(txtPM.Text) > 100 || Double.Parse(txtPM.Text) < 0 ||
                    Int32.Parse(txtRP.Text) < 0    || Int32.Parse(txtLP.Text) < 0 )
                        throw new Exception();

                pm = Double.Parse(txtPM.Text) / 100;
                r = Int32.Parse(txtRP.Text);
                pok = Int32.Parse(txtLP.Text);
                progressBar1.Minimum = 0;
                progressBar1.Maximum = pok;

                
            }
            catch (Exception)
            {
                MessageBox.Show("Źle okreslone prawdopodobieństwo, rozmiar populacji lub ilość pokoleń.", "Błąd parametrów",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
                
                return -1;
            }

            switch (cmbOK.Text)
            {
                case "PMX": ok = 1;
                    break;
                case "CKM": ok = 2;
                    break;
            }
                
            return 0;
        }

        private void btnKoszty_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

            openFileDialog1.FileName = "";
            openFileDialog1.InitialDirectory = Application.StartupPath;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    k = new Koszty(openFileDialog1.FileName);
                    txtKoszty.Text = openFileDialog1.SafeFileName;
                    btnStart.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Błąd wczytywania pliku",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtKoszty.Text = "";
                    k = null;
                }

               
            }
        }

        private void btnZamknij_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
